

#ifndef _MMSL_POW__HPP_
#define _MMSL_POW__HPP_

namespace mmsl{


template<class T>
inline T 
pow_int_2(const T x){
  return x*x;
}

template<class T>
inline T 
pow_int_3(const T x){
  return x*x*x;
}

template<class T>
inline T 
pow_int_4(const T x){
  T tmp = x*x;
  return tmp*tmp;
}


template<class T>
inline T 
pow_int_5(const T x){
  T tmp = x*x;
  return tmp*tmp*x;
}


template<class T>
inline T 
pow_int_6(const T x){
  T tmp = x*x;
  return tmp*tmp*tmp;
}


template<class T>
inline T 
pow_int_7(const T x){
  T tmp = x*x*x;
  return tmp*tmp*x;
}


template<class T>
inline T 
pow_int_8(const T x){
  T tmp = x*x;
  T tmp2 = tmp*tmp;
  return tmp2*tmp2;
}


template<class T>
inline T 
pow_int_9(const T x){
  T tmp = x*x*x;
  return tmp*tmp*tmp;
}



template<class T>
inline T 
pow_int_10(const T x){
  T tmp = x*x;
  T tmp2 = tmp*tmp;
  return tmp2*tmp2*tmp;
}




template<class T>
inline T pow_int(const T x, int n)
{
  
  T y = 1;
  T p = x;
  
  if(n < 0) {
     p = 1.0 / x;
     n = -n;
  }

  while(1){
    if (n & 1) y *= p;
    n = n >> 1;
    if (n == 0) return y;
    p = p * p;
  }
}

}




#endif //_MMSL_POW__HPP_
